#include "Thread.h"
#include "EventLoop.h"
#include "EventLoopThread.h"
EventLoopThread::EventLoopThread(const ThreadInitCallback& cb,const std::string& name)
    : loop_(nullptr)
    , exiting_(false)
    , thread_(std::bind(&EventLoopThread::threadFunc,this),name)
    , mutex_()
    , cond_()
    ,callback_(cb)
{

}
EventLoopThread::~EventLoopThread()
{
    exiting_=true;
    if(loop_!=nullptr)
    {
        loop_->quit();
        thread_.join();
    }
}

// 启动新线程并获取该线程中创建的 EventLoop 对象指针
EventLoop* EventLoopThread::startLoop()
{
    thread_.start(); //启动新线程 执行threadFunc()

    EventLoop* loop =nullptr;

    {
        std::unique_lock<std::mutex> lock(mutex_);
        // 等待新线程中完成 EventLoop 初始化
        while(loop_==nullptr)
        {
            // 释放锁并阻塞等待新线程的通知
            cond_.wait(lock);
        }
        loop=loop_;
    }
    return loop;
}

// 下面这个方法是在单独的新线程里运行的
void EventLoopThread::threadFunc()
{
    // 创建一个独立的EventLoop 和上面的线程一一对应 one loop per thread
    EventLoop loop;
    if(callback_)
    {
        callback_(&loop);
    }

    {
        std::unique_lock<std::mutex> lock(mutex_);
        // // 将成员变量loop_指向新创建的EventLoop
        loop_=&loop; 
        // 唤醒主线程 (通知"EventLoop已准备好")
        cond_.notify_one();
    }

    loop.loop(); 
    
    std::unique_lock<std::mutex> lock(mutex_);
    loop_=nullptr;
}